// 题目描述
// 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。

// 请你找出平均数最大且 长度为 k 的连续子数组，并输出该最大平均数。

// 任何误差小于 10-5 的答案都将被视为正确答案。

 

// 示例 1：

// 输入：nums = [1,12,-5,-6,50,3], k = 4
// 输出：12.75
// 解释：最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
// 示例 2：

// 输入：nums = [5], k = 1
// 输出：5.00000

// 自己的答案（超出时间限制，能解出）：
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findMaxAverage = function(nums, k) {
    if(nums.length === 1) {
        return nums[0] / k
    }
    let count = -Infinity;
    for(let i = 0; i < nums.length - k + 1; i++) {
        const result = nums.slice(i, i + k).reduce((sum, item) => sum + item, 0)
        if(result > count) {
            count = result
        }
    }
    return count / k
};

// Gpt解法：
/**
 * 找出平均数最大且长度为 k 的连续子数组的最大平均数
 * @param {number[]} nums - 整数数组
 * @param {number} k - 连续子数组的长度
 * @returns {number} - 最大平均数
 */
function findMaxAverage(nums, k) {
    // 检查输入的有效性
    if (nums.length < k || k <= 0) {
        throw new Error("Invalid input: Array length must be greater than or equal to k, and k must be positive.");
    }

    // 计算初始窗口的和
    let sum = nums.slice(0, k).reduce((acc, curr) => acc + curr, 0);
    let maxSum = sum;

    // 使用滑动窗口计算每个窗口的和
    for (let i = k; i < nums.length; i++) {
        sum = sum - nums[i - k] + nums[i]; // 更新窗口的和
        if (sum > maxSum) {
            maxSum = sum; // 更新最大和
        }
    }

    // 计算并返回最大平均数
    return maxSum / k;
}

// 示例测试
const nums1 = [1, 12, -5, -6, 50, 3];
const k1 = 4;
console.log(findMaxAverage(nums1, k1)); // 输出: 12.75

const nums2 = [5];
const k2 = 1;
console.log(findMaxAverage(nums2, k2).toFixed(5)); // 输出: 5.00000

// 官方解法：
// 1.原数组实现
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findMaxAverage = function (nums, k) {
    const len = nums.length;

    let ans = nums[0];
    for (let i = 1; i < len; i++) {
        nums[i] += nums[i - 1];
        if (i === k - 1) {
            ans = nums[i];
        }
        if (i >= k) {
            ans = ans > (nums[i] - nums[i - k]) ? ans : nums[i] - nums[i - k];
            console.log(i, ans)
        }
    }
    if (k === len) {
        ans = nums[len - 1];
    }
    return ans / k;
};

// 2.滑动窗口
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findMaxAverage = function (nums, k) {
    let sum = 0;
    let len = nums.length;
    for (let i = 0; i < k; i++) {
        sum += nums[i];
    }
    let maxSum = sum;
    for (let i = k; i < len; i++) {
        sum = sum - nums[i - k] + nums[i];
        maxSum = Math.max(maxSum, sum);
    }
    return maxSum / k;
};